widget: Don't queue redraws for properties that don't affect anything
authorJasper St. Pierre <jstpierre@mecheye.net>
Sun, 2 Aug 2015 19:37:03 +0000 (12:37 -0700)
committerJasper St. Pierre <jstpierre@mecheye.net>
Sun, 2 Aug 2015 19:57:31 +0000 (12:57 -0700)
Properties like transition-property might change when hovering over
something, even if the property itself does not change. These properties
don't affect drawing, so don't queue redraws for them.

gtk/gtkcsstypesprivate.h
gtk/gtkwidget.c

index 4018048a45f83e7e27b07ea7844d9d61806731ca..898051efe4635e1ad5b50c5ff611e9ba60bfd973 100644 (file)
@@ -134,6 +134,15 @@ typedef enum {
   GTK_CSS_AFFECTS_SIZE = (1 << 9)
 } GtkCssAffects;
 
+#define GTK_CSS_AFFECTS_REDRAW (GTK_CSS_AFFECTS_FOREGROUND |    \
+                                GTK_CSS_AFFECTS_BACKGROUND |    \
+                                GTK_CSS_AFFECTS_BORDER |        \
+                                GTK_CSS_AFFECTS_FONT |          \
+                                GTK_CSS_AFFECTS_TEXT |          \
+                                GTK_CSS_AFFECTS_TEXT_ATTRS |    \
+                                GTK_CSS_AFFECTS_ICON |          \
+                                GTK_CSS_AFFECTS_OUTLINE)
+
 enum { /*< skip >*/
   GTK_CSS_PROPERTY_COLOR,
   GTK_CSS_PROPERTY_DPI,
index 37348ad8d1fdd2cd56627339f9622534aed51e02..2f3b142352c300d229c935edf5d88fe76a1502fc 100644 (file)
@@ -8250,14 +8250,17 @@ gtk_widget_real_style_updated (GtkWidget *widget)
 
       if (widget->priv->anchored)
         {
-          static GtkBitmask *affects_size = NULL;
+          static GtkBitmask *affects_size, *affects_redraw;
 
           if (G_UNLIKELY (affects_size == NULL))
-            affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
+            {
+              affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
+              affects_redraw = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_REDRAW);
+            }
 
           if (changes == NULL || _gtk_bitmask_intersects (changes, affects_size))
             gtk_widget_queue_resize (widget);
-          else
+          else if (_gtk_bitmask_intersects (changes, affects_redraw))
             gtk_widget_queue_draw (widget);
         }
     }